#include "vector2d.h"

Vector2d::Vector2d()
{
    modulo = DOUBLE_NAN;
}

Vector2d::Vector2d(const Angulo& angulo, double modulo)
{
    this->angulo = angulo;
    this->modulo = modulo;
    normalizar();
}

Vector2d::Vector2d(double dx, double dy)
{
    setCoordenadas(dx, dy);
}

Vector2d::Vector2d(const Punto2d& p1, const Punto2d& p2)
    
{
    setCoordenadas(p2.getX() - p1.getX(), p2.getY() - p1.getY());
}

void Vector2d::setCoordenadas(double dx, double dy)
{
    modulo = sqrt(dx * dx + dy * dy);
    angulo.setRadianes(atan2(dy, dx));
}

Vector2d Vector2d::sumar(const Vector2d& otroVector) const
{
    return Vector2d(getX() + otroVector.getX(), getY() + otroVector.getY());
}

QString Vector2d::toString() const
{
    return QString("Vector %1 %2").arg(modulo).arg(getAngulo().toString());
}

Punto2d Vector2d::trasladarPunto(const Punto2d& p) const
{
    return Punto2d(getX() + p.getX(), getY() + p.getY());
}

double Vector2d::getModulo() const
{
    return modulo;
}

void Vector2d::setModulo(double modulo)
{
    this->modulo = modulo;
    normalizar();
}

void Vector2d::setAngulo(const Angulo& angulo) {
    this->angulo = angulo;
}

Angulo Vector2d::getAngulo() const {
    return angulo;
}

double Vector2d::getX() const {
    return modulo * cos(angulo.getRadianes());
}

double Vector2d::getY() const {
    return modulo * sin(angulo.getRadianes());
}

Vector2d Vector2d::getVectorNormalizado() const
{
    return Vector2d(angulo, 1);
}

Vector2d Vector2d::getVectorInvertido() const
{
    return Vector2d(Angulo::suma(angulo, Angulo(180)), modulo);
}

Vector2d Vector2d::multiplicar(double factor) const
{
    return Vector2d(angulo, modulo * factor);
}

bool Vector2d::esNulo() const
{
    return fequals(modulo, 0);
}

void Vector2d::normalizar()
{
    if (modulo < 0) {
        angulo.sumarGrados(180);
        modulo = -modulo;
    }
}

bool Vector2d::sonIguales(const Vector2d& vector1, const Vector2d& vector2)
{
    return Angulo::sonIguales(vector1.getAngulo(), vector1.getAngulo()) &&
           fequals(vector1.getModulo(), vector1.getModulo());
}

Vector2d Vector2d::getVectorInvalido()
{
    return Vector2d(Angulo(), DOUBLE_NAN);
}